소프트웨어의 정의 및 특성
소프트웨어란 프로그램과 프로그램의 개발, 운영, 유지보수에 필요한 정보의 일체를 의미한다. 소프트웨어는 다음과 같은 특성을 갖는다.
소프트웨어의 특성
- 비가시성(Intangible)
- 복잡성(Complexity)
- 변경성(Changeability)
- 비마모성(Longevity)
소프트웨어의 위기 $\rightarrow$ 소프트웨어공학의 등장배경
- 소프트웨어 개발에 필요한 시간 및 비용 예측력 부족
- 개발된 소프트웨어의 품질 수준 부족
- 하드웨어에 대한 소프트웨어의 상대적 비용 변화
- 유지보수의 역할 증대
- 하드웨어 및 소프트웨어 기술의 급속한 발전
- 크고 복잡한 소프트웨어에 대한 수요 증가
소프트웨어공학의 정의 및 3요소
소프트웨어공학이란 소프트웨어를 개발하고, 운영하며, 유지보수하고, 폐기하기까지의 과정에 적용되는 시스템적 접근방안이다. (IEEE)
방법(Method)
- 프로젝트 계획수립과 추정, 시스템과 소프트웨어 분석, 자료구조, 프로그램구조, 알고리즘, 코딩, 테스트, 유지보수 등
- 특수한 언어 중심 또는 그래표 표기법 및 소프트웨어 품질에 대한 일련의 평가기준을 도입한다.
도구(Tool)
- 소프트웨어 개발을 지원하는 시스템 설정
절차(Procedures)
- 방법과 도구를 결합하여 소프트웨어를 합리적이고 적시에 개발하도록 한다.
소프트웨어공학의 과정
정의 과정: 무엇(What)에 초점
시스템 분석
- 컴퓨터기반 시스템에서 각 요소가 해야 할 역할을 정의한다.
- 소프트웨어가 수행해야 할 역할을 할당한다.
프로젝트 계획 수립
- 위험 분석
- 자원 할당
- 비용 추정
- 작업 내용과 일정 결정
요구사항 분석
- 개발방향 제시 (개발된 소프트웨어에 대한 정보와 기능의 상세한 정의)
개발 과정: 어떻게(How)에 초점
설계
소프트웨어에 대한 요구사항들을 자료구조, 알고리즘적 절차, 인터페이스의 특성을 묘사하는 일련의 표현으로 변환한다.
구현
설계 표현은 컴퓨터에 의해 실행되어질 수 있는 명령어를 가져다주는 프로그래밍 언어로 변환되어야 한다.
테스트
소프트웨어의 기능적, 논리적, 구현에서의 결함을 발견하기 위한 테스트를 실시한다.
유지보수 과정: 변경에 초점
수정
수정적 유지보수는 결함이 수정되도록 소프트웨어를 변경한다.
적응
적응적 유지보수는 외부적인 환경변화(CPU, OS, 주변장치 변경 등)를 수용할 수 있도록 소프트웨어를 변경한다.
기능향상
완전한 유지보수는 본래 요구된 기능을 능가하도록 소프트웨어를 확장한다.
소프트웨어공학의 원리
정형성(Formality)
수학에 근거를 둔 것으로 수학적 표현과 증명이 가능하다.
엄격(Rigor)
정형화 기법을 대신할 수 있는 원리로 소프트웨어의 명세 또는 문서화를 엄격히 함으로써 프로세스의 재사용을 향상시킬 수 있다.
관심사의 분리(Separation of Concern)
소프트웨어 개발 시에 각 단계별, 품질별, 크기별, 역할별로 분리하여 문제를 해결한다.
모듈화(Modularity)
소프트웨어 개발시 모듈들이 서로 정보를 교환하면서 사용자가 필요로 하는 서비스를 제공하기 때문에 개별 모듈들이 가능한 정보 공유 또는 정보 교환의 횟수를 적게 설계한다.
추상화 (Abstraction)
각 단계별 목적에 필요한 정보 이외에는 생략함으로 개발자가 쉽게 문제를 이해하고 의견 교환을 하기 위한 필수적인 원리이다.
일반화(Generality)
소프트웨어의 경우 공통적인 소프트웨어를 개발하여 소프트웨어의 재사용 가능성을 높인다.
점진화(Incrementally)
후반에 통합에 대한 충격을 분산하여 그 영향을 완화하는데 효과적이다.
소프트웨어공학 vs. 건축공학
특수한 연산과 목적을 위해 사용되던 초기와 달리, 소프트웨어는 하드웨어적인 종속성을 벗어나 효율적이고 효과적인 소프트웨어 개발을 하기 위해 공학적인 접근이 필요했으며 이때 건축공학을 참조했다.
공통점
- 설계자, 아키텍트, 디자인패턴, 재활용 등 건축공학에서 쓰이는 용어를 사용한다.
- 둘 다 절차지향적이다. (요구사항 분석 $\rightarrow$ 설계 $\rightarrow$ 구축 $\rightarrow$ 운영 $\rightarrow$ 유지보수)
- 다만, 소프트웨어공학에 건축공학의 절차를 그대로 활용화기에는 한계점이 존재한다.
차이점
- 육체 노동적 보다는 정신 노동적이다.
- 눈에 보이지 않는 특성들을 가진다.
- 변경이 용이하다는 유연성을 가진다.